// 全局权限验证
module.exports = (option, app)=>{
  return async (ctx, next)=>{
    // 1.获取 header头 token
    // const { token } = ctx.header;
    let token = ctx.header.token || ctx.query.token;
    if(!token){
      ctx.throw(400, '您没有权限访问该接口')
    }
    // 2.根据 token 解密，换取用户信息
    let user = {};
    try {
      user = ctx.checkToken(token);
    } catch (error) {
      let fail = error.name === 'TokenExpiredError' ? 'token 已过期! 请重新登录' : 'Token 令牌不合法';
      ctx.throw(400, fail);
    }
    // 3.判断当前用户是否登录
    // 从 redis 获取token
    let t = await ctx.service.cache.get('user_'+user.id);
    if(!t || t !== token){
      // 不存在或不相等的情况下
      ctx.throw(400, 'token 不合法')
    }
    // 4.获取当前用户，验证当前用户是否被禁用
    user = await app.model.User.findByPk(user.id);
    if(!user){
      ctx.throw(400, '用户不存在');
    }
    if(user.status == 0){
      ctx.throw(400, '用户已被禁用');
    }
    // 5.把 user 信息挂载到全局ctx上
    ctx.authUser = user;

    await next();
  }
}